<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script type="text/javascript">
    console.log("========= 参数 =========");
    function f1(x){
        return x*x;
      }
      console.log(f1(2));
      console.log(f1(3));

      function f2(a,b) {

      }
      f2('a','b','c');
      console.log(f2.length);

      console.log ("======= 传递方式 - 传值传递========");
      //函数参数如果是原始类型的值（数值，字符，布尔型），
      //传递方式是传值传递（passes by value),
      //这意味着，在函数体内修改参数值，不会影响到参数外部。
      var a= 2;

      function f3(a){
        a = 3;
        return a;
        }
        console.log (f3(a) + ' ' +a);

        console.log  ("======== 传递方式 - 地址传递 =======");
        var obj = {
          name : 1,
          }

          function f4(o){
            o.name = 2;
            o.age = 18;
          }

          f4(obj);

          console.log(obj.name);

          console.log ("======== 传递方式 - 地址传递 =======");
          //注意，如果函数内部修改的，
          //不是参数对象的某个属性，而是替换掉整个参数，这时不会影响到原始值。

          var arr = [1,2,3];

          function f5(b){
            arr = [2,3,4];
          }

          f5(arr);

          console.log (arr);

          console.log ("======== 同名参数 =======");
          //如果有同名的参数则取最后的那个值。

          function f6(a,a){
            return a;
            }

          console.log (f6(2,3));

          console.log ("======== arguments对象 =======");

          var num = function (a,b,c){
          console.log (arguments[0]);
          console.log (arguments[1]);
          console.log (arguments[2]);
          }

          num(1,2,3);


          console.log ("======== 闭包 =======");

          function f7(){
            var n =99;
            function f8(n){
            console.log(n);
          }
          return f8(n);

          }

        f7();
        </script>
  </body>
</html>
